package com.waitingresult.designpattern.behavioral.template.demo3;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: WangShuai
 * @CreateTime: 2023-10-21  11:49
 * @Description:
 * @Version: 1.0
 */
public class InsertMain {
    private static final Map<Integer, AbsInsertTemplate> initMap = new HashMap<>();

    /**
     * 模仿Spring启动初始化
     */
    private static void init() {
        RuleInsertTemplate ruleInsertTemplate = new RuleInsertTemplate();
        initMap.put(ruleInsertTemplate.type(), ruleInsertTemplate);
        UserInsertTemplate userInsertTemplate = new UserInsertTemplate();
        initMap.put(userInsertTemplate.type(), userInsertTemplate);
        // 项目实际使用中, 会写一个 TemplateManager 去管理我们的模板
//        伪代码
//        class InsertTemplateManager {
//            public InsertTemplateManager(List<AbsInsertTemplate> absInsertTemplateList) {
//                for (AbsInsertTemplate insertTemplate : absInsertTemplateList) {
//                    initMap.put(insertTemplate.type(), insertTemplate);
//                }
//            }
//        }
    }

    public static void main(String[] args) {
        /**
         * 模板方法 是为了规范某件事情的做事逻辑 和先后顺序
         *  具体的实现细节 交给子类去具体实现. 子类不可以改变这个方法的顺序结构,只能去重写这个方法中某一个特殊步骤
         * 以 一个简单的 数据新增功能 做为Demo (只是Demo)
         */
        AbsInsertTemplate template1 = new RuleInsertTemplate();
        template1.doWork();
        AbsInsertTemplate template2 = new UserInsertTemplate();
        template2.doWork();
        // 此时有个问题, 需要明确的 "new" 具体对象,
        // 如果这一步我也不想做, 想根据 接口的入参来确定 到底使用哪个模板?
        //  结合 策略模式(实际项目中 一般也都是结合策略去使用的)
        //===============================================================
        init();//启动时 预加载 当前功能相关的 所有模板
        initMap.get(1).doWork();
        initMap.get(2).doWork();
        //这里的 get1 get2 可以理解成 请求入参对象中的 类型 参数
    }
}

